/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package wf3.core.dao;

import acceso.hibernate.AQuery;
import acceso.hibernate.AccesoHibernate;
import acceso.servlet.Conpar;
import acceso.servlet.Regist;
import acceso.util.Escritor;
import java.util.Date;
import java.util.List;
import org.hibernate.StatelessSession;
import wf.dto.ContenedorDto;
import wf.dto.PaginaDto;
import wf.dto.pptransaini;
import wf.dto.qbfrawor_id_frawor;

/**
 *
 * @author Rómulo Galindo Tanta
 * @version 1.0 -2014-04-12
 */
public class WorkflowDAO extends DAO {

    StatelessSession session = null;
    AQuery query;
    int idsession = 0;

    /**
     * WorkflowDAO: Constructor
     *
     * @param idsession int
     */
    public WorkflowDAO(int idsession) {
        session = AccesoHibernate.getSessionFactory().openStatelessSession();
        this.idsession = idsession;
        query = new AQuery(this.idsession);
        idDAO = System.currentTimeMillis();
        time = idDAO;
    }

    /**
     * getContenedorDto: Devuelve un objeto contenedor basado en el id del
     * mismo.
     *
     * @param co_conten int
     * @return ContenedorDto
     */
    public ContenedorDto getContenedorDto(int co_conten) {
        query.setMquery(session.getNamedQuery("frawor2.pfconten"));
        query.setInteger("p_co_conten", co_conten);
        return (ContenedorDto) query.uniqueResult();
    }

    /**
     * getTransaIni: Devuelve un objeto tipo pptransaini que da inicio al
     * marcada de inicio de una transaccion del workflow
     *
     * @param host String
     * @param fe_solini Date
     * @return pptransaini
     */
//    public pptransaini getTransaIni(String host, Date fe_solini) {
    public int getTransaIni(String host, Date fe_solini) {
        query.setMquery(session.getNamedQuery("frawor2.pptransaini"));
        query.setString("ip_remoto", host);
        query.setInteger("id_session", this.idsession);
        query.setTimestamp("fe_solini", fe_solini);
        return ((pptransaini) query.uniqueResult()).getPptransaini();
    }

    /**
     * getIdFrawor: Devuelve un nuevo id para gestionar una tansacción.
     *
     * @return long
     */
    public long getIdFrawor() {
        query.setMquery(session.getNamedQuery("frawor2.qbfrawor_id_frawor"));
        query.setString("frawor", "fratra.qbfrawor_id_frawor");
        qbfrawor_id_frawor qbfrawor = (qbfrawor_id_frawor) query.uniqueResult();
        return qbfrawor.getNextval();
    }

    /**
     * joindTransa_IdFrawor: Une el id_frawor, el id_fraant ( id_frawor anterior
     * )
     *
     * @param id_frawor int
     * @param id_fraant int
     * @param co_conten int
     */
    public void joindTransa_IdFrawor(long id_frawor, long id_fraant, int co_conten) {
        query.setMquery(session.getNamedQuery("frawor2.pfins_tbfrawor"));
        query.setInteger("p_id_sesion", this.idsession);
        query.setInteger("p_id_frawor", (int) id_frawor);
        query.setInteger("p_id_fraant", (int) id_fraant);
        query.setInteger("p_co_conten", co_conten);
        query.uniqueResult();
    }

    /**
     * deletePagreg: Borra un registro Pagreg en base al if_frawor y el código
     * de página
     *
     * @param id_frawor long
     * @param co_pagina int
     */
    public void deletePagreg(long id_frawor, int co_pagina) {
        query.setMquery(session.getNamedQuery("frawor2.pfdel_tbpagreg"));
        query.setLong("p_id_frawor", id_frawor);
        query.setInteger("p_co_pagina", co_pagina);
        query.uniqueResult();
    }

    /**
     * insertPagreg: Inserta un registro Pagreg en base al id_frawor
     *
     * @param id_frawor long
     * @param registro Regist
     */
    public void insertPagreg(long id_frawor, Regist registro) {
        query.setMquery(session.getNamedQuery("frawor2.pfins_tbpagreg"));
        query.setLong("p_id_frawor", id_frawor);
        query.setInteger("p_co_pagina", registro.getPagina());
        query.setShort("p_co_pagreg", registro.getPagreg());
        query.setShort("p_nu_pagfil", registro.getPagfil());
        query.setString("p_va_pagreg", registro.getValor());
        query.uniqueResult();
    }

    /**
     * insertConpar: Inserta un parametro al contenedor
     *
     * @param id_frawor
     * @param co_conten
     * @param co_conpar
     */
    public void insertConpar(long id_frawor, int co_conten, Conpar co_conpar) {
        query.setMquery(session.getNamedQuery("frawor2.pfins_tbconpar"));
        query.setLong("p_id_frawor", id_frawor);
        query.setInteger("p_co_conten", co_conten);
        query.setShort("p_co_conpar", co_conpar.getId());
        query.setString("p_va_conpar", co_conpar.getValor());
        query.uniqueResult();
    }

    /**
     * insertTraconini
     *
     * @param id_transa int
     * @param id_frawor long
     * @param co_conten
     */
    public void insertTraconini(int id_transa, long id_frawor, int co_conten) {
        query.setMquery(session.getNamedQuery("frawor2.pptraconini"));
        query.setInteger("p_id_transa", id_transa);
        query.setInteger("p_id_frawor", (int) id_frawor);
        query.setInteger("p_co_conten", co_conten);
        query.uniqueResult();
    }

    /**
     * getConpag: Retorna una lista de paginas por el contenedor solicitado
     *
     * @param co_conten
     * @param id_frawor
     * @return
     */
    public List<PaginaDto> getConpag(int co_conten, long id_frawor) {
        query.setMquery(session.getNamedQuery("frawor2.pfconpag"));
        query.setInteger("p_co_conten", co_conten);
        query.setLong("p_id_frawor", id_frawor);
        return query.list();
    }

    /**
     * getContab: Retorna una lista de tabs en base al contenedor solicitante
     *
     * @param co_conten
     * @return
     */
    public List getContab(int co_conten) {
        query.setMquery(session.getNamedQuery("frawor2.tbcontab"));
        query.setInteger("p_co_conten", co_conten);
        return query.list();
    }

    /**
     * getContab: Retorna una lista de tabs en base al contenedor solicitante
     *
     * @param id_frawor long
     * @param co_conten int
     * @param co_pagina int
     * @param co_regist short
     * @return
     */
    public List getCompag(long id_frawor, int co_conten, int co_pagina, short co_regist) {
        query.setMquery(session.getNamedQuery("frawor2.pfcompag"));
        query.setLong("p_id_frawor", id_frawor);
        query.setInteger("p_co_conten", co_conten);
        query.setInteger("p_co_pagina", co_pagina);
        query.setShort("p_co_regist", co_regist);
        return query.list();
    }

    @Override
    public void CLOSE_SESSION() throws Exception {
        close = true;
        session.close();
        session = null;
        query = null;
        Escritor.escribe_debug("[" + idDAO + "] WorkflowDAO-> cerrado.");
    }

    @Override
    public long getIdDAO() {
        return idDAO;
    }

    @Override
    public long getTimelife() {
        return time;
    }

    @Override
    public boolean isClosed() {
        return close;
    }

}
